package com.bawei.caohao0802.view.activity

import android.content.Intent
import android.widget.SeekBar
import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.Toast
import androidx.lifecycle.Observer
import coil.load
import com.bawei.caohao0802.MyApp
import com.bawei.caohao0802.R
import com.bawei.caohao0802.databinding.ActivityZhiBoBinding
import com.bawei.caohao0802.model.util.RsaCoder
import com.bawei.caohao0802.viewmodel.ZhiBoViewModel
import com.bawei.caohao20240730.base.BaseActivity
import com.blankj.utilcode.util.UriUtils
import com.ksyun.media.streamer.capture.CameraCapture
import com.ksyun.media.streamer.filter.imgtex.ImgBeautyProFilter
import com.ksyun.media.streamer.filter.imgtex.ImgFilterBase
import com.ksyun.media.streamer.kit.KSYStreamer
import com.ksyun.media.streamer.kit.StreamerConstants
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.RequestBody
import java.io.File


class ZhiBoActivity : BaseActivity<ZhiBoViewModel,ActivityZhiBoBinding>(R.layout.activity_zhi_bo) {
    override fun dataObser() {
        mViewModel.zhibodata.observe(this, Observer {
            Toast.makeText(this, it.message, Toast.LENGTH_SHORT).show()
            if(it.liveData!=null){
                var liveRtmpUrl = it.liveData.liveRtmpUrl
                var split = liveRtmpUrl.split("pwd=")
                var publicKey =
                    RsaCoder.encryptByPublicKey(RsaCoder.decryptByPublicKey(split[1]))

                mStreamer.url=split[0]+"pwd="+publicKey.replace("/".toRegex(),"-").replace("\\+".toRegex(),"~")
                mStreamer.startStream()

            }
        })
    }
    lateinit var file:File
    override fun initView() {
        mstrart()
        mDing.img.setOnClickListener {
            startActivityForResult(Intent(Intent.ACTION_PICK).apply {
                type="image/*"
            },1000)
        }
        mDing.kai.setOnClickListener {
            var body=RequestBody.create("multipart/form-data".toMediaTypeOrNull(),file)
            var part=MultipartBody.Part.createFormData("liveCoverImage",file.name,body)
            mViewModel.getzhibo(MyApp.userId,MyApp.sessionId,101,"111","111",mDing.title.text.toString(),part)
        }

        mDing.xia.setOnClickListener {
            Toast.makeText(this, "下播", Toast.LENGTH_SHORT).show()
            mStreamer.stopStream()
        }
        // 设置美颜类型
        // 设置美颜类型
        val filter: ImgFilterBase = ImgBeautyProFilter(mStreamer.glRender, this)
        mStreamer.imgTexFilterMgt.setFilter(filter)
// 设置美颜级别（首先判断是否支持，然后进行设置）
// 设置磨皮级别，范围0-1
// 设置美颜级别（首先判断是否支持，然后进行设置）
// 设置磨皮级别，范围0-1
        if (filter.isGrindRatioSupported) {
            filter.grindRatio = 0.6.toFloat()
        }
// 设置美白级别，范围0-1
// 设置美白级别，范围0-1
        if (filter.isWhitenRatioSupported) {
            filter.whitenRatio = 0.6.toFloat()
        }
// 设置红润级别，一般范围为0-1，BeautyPro为-1.0~1.0
// 设置红润级别，一般范围为0-1，BeautyPro为-1.0~1.0
        if (filter.isRuddyRatioSupported) {
            filter.ruddyRatio = -0.3.toFloat()
        }
        mDing.seek.setOnSeekBarChangeListener(object :OnSeekBarChangeListener{
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                filter.grindRatio= (progress*1.0/100).toFloat()
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {

            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {

            }

        })
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode==1000&&data!=null){
            file=UriUtils.uri2File(data.data)
            mDing.img.load(data.data)
        }
    }
    lateinit var mStreamer:KSYStreamer
    private fun mstrart() {
// 创建KSYStreamer实例
        mStreamer = KSYStreamer(this);
// 设置预览View
        mStreamer.setDisplayPreview(mDing.cameraPreview);
// 设置推流url（需要向相关人员申请，测试地址并不稳定！）
        mStreamer.setUrl("rtmp://mobile.kscvbu.cn/live/{streamName}");
// 设置预览分辨率, 当一边为0时，SDK会根据另一边及实际预览View的尺寸进行计算
        mStreamer.setPreviewResolution(480, 0);
// 设置推流分辨率，可以不同于预览分辨率（不应大于预览分辨率，否则推流会有画质损失）
        mStreamer.setTargetResolution(480, 0);
// 设置预览帧率
        mStreamer.setPreviewFps(15f);
// 设置推流帧率，当预览帧率大于推流帧率时，编码模块会自动丢帧以适应设定的推流帧率
        mStreamer.setTargetFps(15f);
// 设置视频码率，分别为初始平均码率、最高平均码率、最低平均码率，单位为kbps，另有setVideoBitrate接口，单位为bps
        mStreamer.setVideoKBitrate(600, 800, 400);
// 设置音频采样率
        mStreamer.setAudioSampleRate(44100);
// 设置音频码率，单位为kbps，另有setAudioBitrate接口，单位为bps
        mStreamer.setAudioKBitrate(48);
        /**
         * 设置编码模式(软编、硬编)，请根据白名单和系统版本来设置软硬编模式，不要全部设成软编或者硬编,白名单可以联系金山云商务:
         * StreamerConstants.ENCODE_METHOD_SOFTWARE
         * StreamerConstants.ENCODE_METHOD_HARDWARE
         */
        mStreamer.setEncodeMethod(StreamerConstants.ENCODE_METHOD_SOFTWARE);
// 设置屏幕的旋转角度，支持 0, 90, 180, 270
        mStreamer.setRotateDegrees(0);
// 设置开始预览使用前置还是后置摄像头
        mStreamer.setCameraFacing(CameraCapture.FACING_FRONT);

    }
    override fun onResume() {
        super.onResume()
        // 一般可以在onResume中开启摄像头预览
        mStreamer.startCameraPreview()
        // 调用KSYStreamer的onResume接口
        mStreamer.onResume()
        // 如果onPause中切到了DummyAudio模块，可以在此恢复
        mStreamer.setUseDummyAudioCapture(false)
    }

    override fun onPause() {
        super.onPause()
        mStreamer.onPause()
        // 一般在这里停止摄像头采集
        mStreamer.stopCameraPreview()
        // 如果希望App切后台后，停止录制主播端的声音，可以在此切换为DummyAudio采集，
        // 该模块会代替mic采集模块产生静音数据，同时释放占用的mic资源
        mStreamer.setUseDummyAudioCapture(true)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 清理相关资源
        mStreamer.release()
    }
}